using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using APP.QUANLY.Entity;
using APP.QUANLY.DAL;
using APP.QUANLY.Entity.ConditionForm;
using APP.QUANLY.Common;

namespace APP.QUANLY.Provider
{
    public class HOADONHAPKHOCHITIET_Provider
    {
        public IDbConnection dbConnection;
        private string _ErrMsg;
        public string ErrMsg { get { return _ErrMsg; } }
	
        public HOADONHAPKHOCHITIET_Provider()
        {
            dbConnection = StaticVar.ServerConnection;
        }
	
        public HOADONHAPKHOCHITIET_Provider(IDbConnection con)
        {
            dbConnection = con;
        }
		#region Load Table
        /// <summary>
        /// Lấy tất cả HOADONHAPKHOCHITIET trong dữ liệu.
        /// </summary>
        /// <returns></returns>
         public HOADONHAPKHOCHITIETList GetAll()
        {
            HOADONHAPKHOCHITIETList list = null;
            IDbConnection con = dbConnection;
            try
            {
                try { if (con.State != ConnectionState.Open)  con.Open(); }
                catch{ throw new Exception("Không thể kết nối đến cơ sở dữ liệu");}
                HOADONHAPKHOCHITIETDao dao = new HOADONHAPKHOCHITIETDao(con);
                list = dao.SelectAll();
            }
            catch (Exception ex)
            {
                list = null;
                _ErrMsg = ex.Message;
            }
            finally
            {
                if (con.State != ConnectionState.Closed) { con.Close(); }
            }
            return list;
        }
        
        /// <summary>
        /// Tìm HOADONHAPKHOCHITIET dựa theo _MACHITIETHOADON.
        /// </summary>
        /// <param name="_MACHITIETHOADON"></param>
        /// <returns></returns>
        public HOADONHAPKHOCHITIET GetBy_MACHITIETHOADON(string MACHITIETHOADON)
        {
            HOADONHAPKHOCHITIET obj = null;
            IDbConnection con = dbConnection;
            try
            {
                try { if (con.State != ConnectionState.Open)  con.Open();  }
                catch{throw new Exception("Không thể kết nối đến cơ sở dữ liệu"); }
				obj = GetHOADONHAPKHOCHITIET_NoOpenConnection(con,MACHITIETHOADON);
                if (obj == null) { throw new Exception("HOADONHAPKHOCHITIET không tồn tại"); }
				else obj.IsExisting = true;
            }
            catch (Exception ex)
            {
                obj = null;
                _ErrMsg = ex.Message;
            }
            finally
            {
                if (con.State != ConnectionState.Closed) { con.Close(); }
            }
            return obj;
        }

		/// <summary>
        /// Lấy HOADONHAPKHOCHITIET dựa vào _MACHITIETHOADON, không mở hay đóng Connection. khong co Transaction
        /// </summary>
        /// <param name="_MACHITIETHOADON"></param>
        /// <returns></returns>
        private HOADONHAPKHOCHITIET GetHOADONHAPKHOCHITIET_NoOpenConnection(IDbConnection con,string MACHITIETHOADON)
        {
			HOADONHAPKHOCHITIET obj = null;
			try
			{
            	HOADONHAPKHOCHITIETDao DAO = new HOADONHAPKHOCHITIETDao(con);
            	obj = DAO.SelectByKey(MACHITIETHOADON);
			}
			catch
			{
				throw new Exception("Không tìm thấy HOADONHAPKHOCHITIET.");
				obj = null;
			}
			return obj;
        }
		
		/// <summary>
        /// Lấy HOADONHAPKHOCHITIET dựa vào _MACHITIETHOADON, không mở hay đóng Connection. co Transaction
        /// </summary>
        /// <param name="_MACHITIETHOADON"></param>
        /// <returns></returns>
		private HOADONHAPKHOCHITIET GetHOADONHAPKHOCHITIET_NoOpenConnection(IDbConnection con,string MACHITIETHOADON, IDbTransaction trans)
        {
			HOADONHAPKHOCHITIET obj = null;
			try
			{
            	HOADONHAPKHOCHITIETDao DAO = new HOADONHAPKHOCHITIETDao(con);
            	obj = DAO.SelectByKey(MACHITIETHOADON, trans);
			}
			catch
			{
				throw new Exception("Không tìm thấy HOADONHAPKHOCHITIET.");
				obj = null;
			}
			return obj;
        }
		#endregion
		
		#region /////////////////////////////////Load Cau Lenh SQL Command //////////////////////////////////////
        //--------------------------------------Load List---------------------------------------------------------
         private bool loadList(IDbConnection con, string commandtext)
         {
            IDbTransaction trans = null;
            bool res;
            try
            {
                try { if (con.State != ConnectionState.Open)  con.Open();  }
                catch{throw new Exception("Không thể kết nối đến cơ sở dữ liệu"); }
				
                trans = con.BeginTransaction();
				HOADONHAPKHOCHITIETDao dao = new HOADONHAPKHOCHITIETDao(con);
                dao.LoadByCommandText(commandtext, trans);
                trans.Commit();
                res = true;
            }
            catch (Exception ex)
            {
                _ErrMsg = ex.Message;
				if(trans!=null)
					trans.Rollback();
                res = false;
            }
            finally
            {
                if (con.State != ConnectionState.Closed) { con.Close(); }
            }
            return res;	
        }	
		//----------------------------------Thao Tac Theo Command Text---------------------------------------
        public bool Cmd_LoadByCommandText(string commandtext)
        {
			bool bKQ = false;
			bKQ = loadList(dbConnection, commandtext);
			if(bKQ) _ErrMsg ="LoadByCommandText  thành công!";
			else  _ErrMsg ="LoadByCommandText  thất bại!";    
			return bKQ;
        }
		#endregion
		
        #region ////////////////////////Thao tác Insert, Update, Delete khong có transaction/////////////////////
        //-------------------------------------Insert_Update-----------------------------------------------------
        private bool Insert_Update(IDbConnection con, HOADONHAPKHOCHITIET obj, bool isInsert)
        {
            HOADONHAPKHOCHITIET obj2 = null;
            IDbTransaction trans = null;
            bool res;
            try
            {
                try { if (con.State != ConnectionState.Open)  con.Open();  }
                catch{throw new Exception("Không thể kết nối đến cơ sở dữ liệu"); }
				try
				{ 
					obj2 = GetHOADONHAPKHOCHITIET_NoOpenConnection(con, obj.MACHITIETHOADON);
				}
				catch{ obj2 = null; }

                HOADONHAPKHOCHITIETDao dao = new HOADONHAPKHOCHITIETDao(con);
                trans = con.BeginTransaction();
                ///Nếu Insert
                if (isInsert)
                {
                    if (obj2 != null) { throw new Exception("HOADONHAPKHOCHITIET này đã tồn tại"); }
					{
                    	dao.Insert(obj, trans);
					}
                }
                ///Nếu Update
                else
                {
                    if (obj2 == null) { throw new Exception("HOADONHAPKHOCHITIET này không tồn tại"); }
					{
                    	dao.Update(obj, trans);
					}
                }
                trans.Commit();
                res = true;
			}
            catch (Exception ex)
            {
                _ErrMsg = ex.Message;
				if(trans!=null)
					trans.Rollback();
                res = false;
            }
            finally
            {
                if (con.State != ConnectionState.Closed) { con.Close(); }
            }
            return res;
        }

        //----------------------------------Delete---------------------------------
        private bool Delete(IDbConnection con, HOADONHAPKHOCHITIET obj)
        {
            HOADONHAPKHOCHITIET obj2 = null;
            IDbTransaction trans = null;
            bool res;
            try
            {
                try { if (con.State != ConnectionState.Open)  con.Open();  }
                catch{throw new Exception("Không thể kết nối đến cơ sở dữ liệu"); }
				try
				{ 
					obj2 = GetHOADONHAPKHOCHITIET_NoOpenConnection(con, obj.MACHITIETHOADON);
				}
				catch{ obj2 = null; }

                HOADONHAPKHOCHITIETDao dao = new HOADONHAPKHOCHITIETDao(con);
                trans = con.BeginTransaction();
               	if (obj2 == null) { throw new Exception("HOADONHAPKHOCHITIET này không tồn tại"); }
                      dao.Delete(obj, trans);
                trans.Commit();
                res = true;
            }
            catch (Exception ex)
            {
                _ErrMsg = ex.Message;
				if(trans!=null)
					trans.Rollback();
                res = false;
            }
            finally
            {
                if (con.State != ConnectionState.Closed) { con.Close(); }
            }
            return res;
        }

        //----------------------------------------Thêm------------------------------------------------------------
        /// <summary>
        /// Thêm HOADONHAPKHOCHITIET mới, dựa vào _MACHITIETHOADON
        /// </summary>
        /// <param name="HOADONHAPKHOCHITIET"></param>
        /// <returns></returns>
        public bool Cmd_ThemHOADONHAPKHOCHITIET(HOADONHAPKHOCHITIET obj)
        {
			bool bKQ = false;
			bKQ = Insert_Update(dbConnection, obj, true);
			if(bKQ) _ErrMsg ="Thêm HOADONHAPKHOCHITIET thành công!";
			else  _ErrMsg ="Thêm HOADONHAPKHOCHITIET thất bại!";    
            return bKQ; 
        }

        //---------------------------------------------Cập Nhật--------------------------------------------------
        /// <summary>
        /// Cập nhật HOADONHAPKHOCHITIET, dựa vào _MACHITIETHOADON
        /// </summary>
        /// <param name="HOADONHAPKHOCHITIET"></param>
        /// <returns></returns>
        public bool Cmd_CapNhatHOADONHAPKHOCHITIET(HOADONHAPKHOCHITIET obj)
        {
			bool bKQ = false;
			bKQ = Insert_Update(dbConnection, obj, false);
			if(bKQ) _ErrMsg ="Cập nhật HOADONHAPKHOCHITIET thành công!";
			else  _ErrMsg ="Cập nhật HOADONHAPKHOCHITIET thất bại!";    
            return bKQ;
        }
        //-------------------------------------------Xóa-------------------------------------------------
        /// <summary>
        /// Xóa HOADONHAPKHOCHITIET, dựa vào _MACHITIETHOADON
        /// </summary>
        /// <param name="HOADONHAPKHOCHITIET"></param>
        /// <returns></returns>
        public bool Cmd_XoaHOADONHAPKHOCHITIET(HOADONHAPKHOCHITIET obj)
        {
			bool bKQ = false;
			bKQ = Delete(dbConnection, obj);
			if(bKQ) _ErrMsg ="Xóa HOADONHAPKHOCHITIET thành công!";
			else  _ErrMsg ="Xóa HOADONHAPKHOCHITIET thất bại!";    
            return bKQ;
        }
		#endregion
		
		#region ///////////////////////////////Tim Kiem////////////////////////////////////////////////////////
        //----------------------------------Tìm Kiếm List Theo Điều Kiện---------------------------------------
        /// <summary>
        /// Tìm Kiếm  HOADONHAPKHOCHITIET, dựa vào ConditionForm
        /// </summary>
        /// <param name="HOADONHAPKHOCHITIET"></param>
        /// <returns></returns>
        public HOADONHAPKHOCHITIETList SearchListByCondition(HOADONHAPKHOCHITIETConditionForm form)
        {
            IDbConnection con = dbConnection;
            try { if (con.State != ConnectionState.Open)  con.Open();  }
            catch{throw new Exception("Không thể kết nối đến cơ sở dữ liệu"); }
            HOADONHAPKHOCHITIETList list = null;
            try
            {
                if (con.State != ConnectionState.Open)  con.Open(); 
                HOADONHAPKHOCHITIETDao dao = new HOADONHAPKHOCHITIETDao(con);
                list = dao.SelectByCondition(form);
            }
            catch (Exception ex)
            {
                list = null;
                _ErrMsg = ex.Message;
            }
            finally
            {
                if (con.State != ConnectionState.Closed) con.Close(); 
            }
            return list;
        }
        //----------------------------------Tìm Kiếm Object Theo Điều Kiện---------------------------------------
        /// <summary>
        /// Tìm Kiếm  HOADONHAPKHOCHITIET, dựa vào ConditionForm
        /// </summary>
        /// <param name="HOADONHAPKHOCHITIET"></param>
        /// <returns></returns>
        public HOADONHAPKHOCHITIET SearchObjectByCondition(HOADONHAPKHOCHITIETConditionForm form)
        {
            IDbConnection con = dbConnection;
            try { if (con.State != ConnectionState.Open)  con.Open();  }
            catch{throw new Exception("Không thể kết nối đến cơ sở dữ liệu"); }
            HOADONHAPKHOCHITIETList list = null;
            try
            {
                if (con.State != ConnectionState.Open)  con.Open(); 
                HOADONHAPKHOCHITIETDao dao = new HOADONHAPKHOCHITIETDao(con);
                list = dao.SelectByCondition(form);
            }
            catch (Exception ex)
            {
                list = null;
                _ErrMsg = ex.Message;
            }
            finally
            {
                if (con.State != ConnectionState.Closed) con.Close(); 
            }
            return list[0];
        }
		#endregion
		
        #region ///////////////////Thao tác Insert, Update, Delete có transaction////////////////////////////
        private bool Insert_Update(IDbConnection con,  IDbTransaction trans, HOADONHAPKHOCHITIET obj, bool isInsert)
        {
            HOADONHAPKHOCHITIET obj2 = null;
            bool res;
            try
            {
                try { if (con.State != ConnectionState.Open)  con.Open();  }
                catch{throw new Exception("Không thể kết nối đến cơ sở dữ liệu"); }
				try
				{ 
					obj2 = GetHOADONHAPKHOCHITIET_NoOpenConnection(con, obj.MACHITIETHOADON, trans);
				}
				catch{ obj2 = null; }

                HOADONHAPKHOCHITIETDao dao = new HOADONHAPKHOCHITIETDao(con);
                ///Nếu Insert
                if (isInsert)
                {
                    if (obj2 != null) { throw new Exception("HOADONHAPKHOCHITIET này đã tồn tại"); }
					{
                    	dao.Insert(obj, trans);
					}
                }
                ///Nếu Update
                else
                {
                    if (obj2 == null) { throw new Exception("HOADONHAPKHOCHITIET này không tồn tại"); }
					{
                    	dao.Update(obj, trans);
					}
                }
                res = true;
			}
            catch (Exception ex)
            {
                _ErrMsg = ex.Message;
				res = false;
            }
            return res;
        }

        //----------------------------------Delete---------------------------------
        private bool Delete(IDbConnection con,  IDbTransaction trans, HOADONHAPKHOCHITIET obj)
        {
            HOADONHAPKHOCHITIET obj2 = null;

            bool res;
            try
            {
                try { if (con.State != ConnectionState.Open)  con.Open();  }
                catch{throw new Exception("Không thể kết nối đến cơ sở dữ liệu"); }
				try
				{ 
					obj2 = GetHOADONHAPKHOCHITIET_NoOpenConnection(con, obj.MACHITIETHOADON, trans);
				}
				catch{ obj2 = null; }

                HOADONHAPKHOCHITIETDao dao = new HOADONHAPKHOCHITIETDao(con);
               	if (obj2 == null) { throw new Exception("HOADONHAPKHOCHITIET này không tồn tại"); }
                dao.Delete(obj, trans);
                res = true;
            }
            catch (Exception ex)
            {
                _ErrMsg = ex.Message;
                res = false;
            }
            return res;
        }
		
        //----------------------------------------Thêm------------------------------------------------------------
        /// <summary>
        /// Thêm HOADONHAPKHOCHITIET mới, dựa vào _MACHITIETHOADON
        /// </summary>
        /// <param name="HOADONHAPKHOCHITIET"></param>
		/// <param name="IDbTransaction"></param>
        /// <returns></returns>
        public bool Cmd_ThemHOADONHAPKHOCHITIET(HOADONHAPKHOCHITIET obj, IDbTransaction trans)
        {
			bool bKQ = false;
			bKQ = Insert_Update(dbConnection, trans, obj, true);
			if(bKQ) _ErrMsg ="Thêm HOADONHAPKHOCHITIET thành công!";
			else  _ErrMsg ="Thêm HOADONHAPKHOCHITIET thất bại!";    
            return bKQ; 
        }

        //---------------------------------------------Cập Nhật--------------------------------------------------
        /// <summary>
        /// Cập nhật HOADONHAPKHOCHITIET, dựa vào _MACHITIETHOADON
        /// </summary>
        /// <param name="HOADONHAPKHOCHITIET"></param>
        /// <returns></returns>
        public bool Cmd_CapNhatHOADONHAPKHOCHITIET(HOADONHAPKHOCHITIET obj, IDbTransaction trans)
        {
			bool bKQ = false;
			bKQ = Insert_Update(dbConnection, trans, obj, false);
			if(bKQ) _ErrMsg ="Cập nhật HOADONHAPKHOCHITIET thành công!";
			else  _ErrMsg ="Cập nhật HOADONHAPKHOCHITIET thất bại!";    
            return bKQ;
        }
        //-------------------------------------------Xóa-------------------------------------------------
        /// <summary>
        /// Xóa HOADONHAPKHOCHITIET, dựa vào _MACHITIETHOADON
        /// </summary>
        /// <param name="HOADONHAPKHOCHITIET"></param>
        /// <returns></returns>
        public bool Cmd_XoaHOADONHAPKHOCHITIET(HOADONHAPKHOCHITIET obj, IDbTransaction trans)
        {
			bool bKQ = false;
			bKQ = Delete(dbConnection, trans, obj);
			if(bKQ) _ErrMsg ="Xóa HOADONHAPKHOCHITIET thành công!";
			else  _ErrMsg ="Xóa HOADONHAPKHOCHITIET thất bại!";    
            return bKQ;
        }

        //-------------------------------------------Inert Bang HOA DON NHAP KHO CHI TIET TU BANG  TAM-------------------------------------------------
        /// <summary>
        /// Inert Bang HOA DON NHAP KHO CHI TIET  TU BANG  TAM
        /// </summary>
        /// <param name="HOADONNHAPKHO"></param>
        /// <returns></returns>
        private bool SAOCHEP_HOADONNHAPCHITIET(IDbConnection con, IDbTransaction trans, string MAHOADONNHAP)
        {
            bool res;
            try
            {
                try { if (con.State != ConnectionState.Open)  con.Open(); }
                catch { throw new Exception("Không thể kết nối đến cơ sở dữ liệu"); }

                HOADONHAPKHOCHITIETDao dao = new HOADONHAPKHOCHITIETDao(con);
                dao.CopyDataHOADONHAPKHOCHITIET(MAHOADONNHAP, trans);
                res = true;
            }
            catch (Exception ex)
            {
                _ErrMsg = ex.Message;
                res = false;
            }
            return res;
        }
        //----------------------------------------Copy Data To HOADONNHAPKHOCHITIET------------------------------------------------------------
        /// <summary>
        /// Inert Bang HOA DON NHAP KHO TU BANG TAM
        /// </summary>
        /// <param name="HOADONNHAPKHO"></param>
        /// <returns></returns>
        public bool Cmd_CopyHOADONNHAPCHIETTIET(string MAHOADONNHAP, IDbTransaction trans)
        {
            bool bKQ = false;
            bKQ = SAOCHEP_HOADONNHAPCHITIET(dbConnection, trans, MAHOADONNHAP);
            if (bKQ) _ErrMsg = "Sao chép HOADONNHAPCHIETTIET thành công!";
            else _ErrMsg = "Sao chép  HOADONNHAPCHIETTIET thất bại!";
            return bKQ;
        }
		#endregion
    }
}